package br.unesp.demac.bcc.soo.clarus.dao;

import br.unesp.demac.bcc.soo.clarus.bean.Localizacao;
import br.unesp.demac.bcc.soo.clarus.util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Evaldo
 */
public class LocalizacaoDAOImp implements LocalizacaoDAO {
    
    /**
     * Salva a localização da obra
     * @param conn Conexão com o banco de dados
     * @param localiz Localização da obra
     * @return Id da localização
     */    
    @Override
    public int salvarLocalizacao(Connection conn, Localizacao localiz){
        int idlocalizacao = 0;
        
        final String query = "INSERT INTO localizacao (codigoCorredor, codigoPrateleira)" + 
                " VALUES (?, ?);";
        PreparedStatement pstmt = null;
        ResultSet res = null;
        
        if (conn != null){
            try{
                pstmt = conn.prepareStatement(query, PreparedStatement.RETURN_GENERATED_KEYS);
                
                pstmt.setString(1, localiz.getCodigoCorredor());
                pstmt.setString(2, localiz.getCodigoPrateleira());
                pstmt.execute();
                res =  pstmt.getGeneratedKeys();
                
                if (res.next())
                    idlocalizacao = res.getInt(1);
            }
            catch(SQLException ex){
                System.out.println("Erro ao inserir Localização: " + ex.getMessage());
            }
            finally{
                FabricaConexao.fechar(pstmt);
            }
        }
        
        return idlocalizacao;
    }
    
    /**
     * Busca todas localizações existentes
     * @return Lista de localizações     
     */
    @Override
    public List<Localizacao> buscaTodasLocalizacoes(){
        final String query = "SELECT idLocalizacao, codigoCorredor, codigoPrateleira " +
                "FROM localizacao;";
        List<Localizacao> lstLocaliz = new ArrayList<Localizacao>();
        Localizacao localiz = null;
                
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        
        if (conn != null){
            try{
                pstmt = conn.prepareStatement(query);
                res = pstmt.executeQuery();
                
                while(res.next()){
                    localiz = new Localizacao();
                    localiz.setIdLocalizacao(res.getInt(1));
                    localiz.setCodigoCorredor(res.getString(2));
                    localiz.setCodigoPrateleira(res.getString(3));
                    lstLocaliz.add(localiz);
                }
            }
            catch(SQLException ex){
                System.out.println("Problemas ao consultar localizações " + ex.getMessage());                
            }
            finally{
                FabricaConexao.fechar(conn, pstmt);
            }
        }
        
        return lstLocaliz;
    }
    
    @Override
    public Localizacao getLocalizacaoById(Connection conn, int idEditora) {

        final String query = "SELECT idLocalizacao, codigoCorredor, codigoPrateleira FROM Localizacao WHERE idLocalizacao = ?";
        PreparedStatement pstmt = null;
        ResultSet res = null;
        Localizacao local = null;

        if (conn != null) {
            try {
                
                pstmt = conn.prepareStatement(query);
                pstmt.setInt(1, idEditora);
                res = pstmt.executeQuery();

                if (res.next()) {
                    local = new Localizacao();
                    local.setIdLocalizacao(res.getInt("idLocalizacao"));
                    local.setCodigoCorredor(res.getString("codigoCorredor"));
                    local.setCodigoPrateleira(res.getString("codigoPrateleira"));
                } 

            } catch (SQLException ex) {
                System.out.println("Erro ao recuperar localizacao: " + ex.getMessage());
            } finally {
                FabricaConexao.fechar(pstmt);
            }
        }

        return local;
    }
    
    @Override
    public Localizacao getLocalizacao(String codCorredor, String codPrateleira){
        final String query = "SELECT idLocalizacao, codigoCorredor, codigoPrateleira FROM Localizacao " + 
                "WHERE codigoCorredor = ? AND codigoPrateleira = ?;";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        Localizacao local = null;
        
        if (conn != null){
            try {
                
                pstmt = conn.prepareStatement(query);
                pstmt.setString(1, codCorredor);
                pstmt.setString(2, codPrateleira);
                res = pstmt.executeQuery();

                if (res.next()) {
                    local = new Localizacao();
                    local.setIdLocalizacao(res.getInt("idLocalizacao"));
                    local.setCodigoCorredor(res.getString("codigoCorredor"));
                    local.setCodigoPrateleira(res.getString("codigoPrateleira"));
                } 

            } catch (SQLException ex) {
                System.out.println("Erro ao recuperar localizacao: " + ex.getMessage());
            } finally {
                FabricaConexao.fechar(pstmt);
            }
        }
        
        return local;
    }
}
